// 封装自己的请求对象
import http from 'wechat-http'

// 定义请求的基地址
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = function (config) {
  // 这里处理token注入
  config.header = {
    // 在原来 header 的基础上，补充一个 Authorization 字段，不能直接覆盖
    Authorization: `Bearer ${getApp().token}`,
    ...config.header,
  }
  // 要将 config 原样返回
  return config
}

// 响应拦截器
// http.intercept.response = function ({ data, statusCode }) {
http.intercept.response = function (res) {
  const { data, statusCode } = res
  // 服务器响应成功
  // 用一个正则，判断2xx段的 状态码
  if (/^2\d{2}$/.test(statusCode)) {
    return Promise.resolve(data)
  }
  // 如果走到这里，说明服务器的响应是失败的
  return Promise.reject(res)
}

/**
 * 刷新token
 */
function refreshToken() {
  return http({
    url: http.baseURL + '/refreshToken',
    method: 'POST',
    header: {
      Authorization: `Bearer ${wx.getStorageSync('refreshToken')}`,
    },
  }).then((res) => {
    // 进到这里说明刷新token的请求成功了
    // 保持最新的token和refreshToken
    // 把token挂到 app 上
    const { token, refreshToken } = res.data
    wx.setStorageSync('token', token)
    wx.setStorageSync('refreshToken', refreshToken)
    getApp().token = token
  })
}

function createAutoRefreshFun(httpRequestFun) {
  return function (...params) {
    return httpRequestFun(...params).catch((err) => {
      if (err.statusCode !== 401) {
        throw err
      }
      // 说明token失效
      return refreshToken()
        .then(() => {
          // 说明刷token成功
          // TODO：重写发一次请求
          return httpRequestFun(...params)
        })
        .catch((err) => {
          // 说明：refreshToken 有可能也失效 statusCode 401
          // 判断状态码是否为 401 ，如果是 401 说明 refreshToken 也失效了
          // 如果 refreshToken 也失效了，那么就让用户重新登录
          if (err.statusCode !== 401) {
            throw err
          }
          wx.navigateTo({
            url: '/pages/login/index',
          })
        })
    })
  }
}

// 把http 挂载到全局 wx 对象上
wx.http = http

// 可以重写 http.get 方法，让这个方法具备自动刷新token的能力
wx.http.get = createAutoRefreshFun(wx.http.get)
wx.http.post = createAutoRefreshFun(wx.http.post)
wx.http.put = createAutoRefreshFun(wx.http.put)
wx.http.delete = createAutoRefreshFun(wx.http.delete)
// 默认导出
export default http
